iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
Modern Web

前端技術研究系列 第 28

useCallback - React 提升效能系列(三)

  • 分享至 

  • xImage
  •  

都講useMemo 了,不講一下 useCallback 嗎,還是其實我已經想不到主題了。/images/emoticon/emoticon20.gif

基礎介紹

useCallback 回傳一個 memoized的 callback function。 其實跟 useMemo 大同小異。useCallback其實就等於回傳一個 function 的 useMemo

useCallback 的目的是避免在 component 內部宣告的 function,因為隨著每次 render 不斷重新被宣告跟建立。

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

相同 React.memo 功能

可以利用 useCallback可以達到相同 React.memo 功能,且更加優化,useCallback 可以記住 function 的記憶體位置,而 React.memo 是 shallow compare 所以 React.memo 會因為"物件型別記憶體位置不同但值相同"而重新渲染。

// 方法一
const Title = useCallback(
    ({ title = ''}) => (
      <p>
        {title}
        <span>預留位置</span>
      </p>
    ),
    []
  );

// 方法二
const Title = useCallback(
    () => (
      <p>
        {title}
        <span>預留位置</span>
      </p>
    ),
    [title]
  );
// 引用方式
<Title title={'title'} />

這邊範例是用來表示 useCallback 可以當一個接收 參數的函示,當參數有所改變時, function 會被重新呼叫,或是利用 dependency 來觸發。

與 useMemo 比較

而這邊範例則是用來表示,useCallback 如果有 return value 時,基本上功能與 useMemo 大同小異

// return value
const getType = useCallback(() => {
    if (count % 2 === 0) {
      return "偶數";
    } else {
      return "奇數";
    }
  }, [count]);

// 引用方式
getType()

const getMemoType = useMemo(() => {
    if (count % 2 === 0) {
      return "偶數";
    } else {
      return "奇數";
    }
  }, [count]);

提供 codesandbox 歡迎一同服用~


上一篇
useMemo - React 提升效能系列(二)
下一篇
繼承與原型鏈
系列文
前端技術研究30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言